package cn.bugstack.mybatis.session;

import cn.bugstack.mybatis.binding.MapperRegistry;
import cn.bugstack.mybatis.mapping.MappedStatement;

import java.util.HashMap;
import java.util.Map;

/**
 * 配置类，用于管理和存储映射语句以及映射器相关信息。
 */
public class Configuration {

    // 注册表，用于注册和管理映射器
    private MapperRegistry mapperRegistry = new MapperRegistry(this);

    // 存储映射语句的容器，键为映射语句ID，值为映射语句对象
    private Map<String, MappedStatement> mappedStatements = new HashMap<>();

    /**
     * 添加一个映射语句到配置中。
     * @param ms 要添加的映射语句对象
     */
    public void addMappedStatement(MappedStatement ms) {
        mappedStatements.put(ms.getId(), ms);
    }

    /**
     * 根据ID获取映射语句。
     * @param id 映射语句的ID
     * @return 返回对应的映射语句对象，如果不存在则返回null
     */
    public MappedStatement getMappedStatement(String id) {
        return mappedStatements.get(id);
    }

    /**
     * 为当前配置添加一个映射器接口。
     * @param type 要添加的映射器接口的类型
     */
    public <T> void addMapper(Class<T> type) {
        mapperRegistry.addMapper(type);
    }

    /**
     * 为当前配置添加一个包下所有的映射器接口。
     * @param packageName 要添加的映射器接口所在的包名
     */
    public void addMappers(String packageName) {
        mapperRegistry.addMappers(packageName);
    }

    /**
     * 根据类型获取映射器实例。
     * @param type 映射器接口的类型
     * @param sqlSession 当前的SQL会话
     * @return 返回映射器接口的实例
     */
    public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
        return mapperRegistry.getMapper(type, sqlSession);
    }

    /**
     * 检查是否已经注册了指定类型的映射器。
     *
     * @param type 映射器接口的类型
     * @return 如果已注册返回true，否则返回false
     */
    public boolean hasMapper(Class<?> type) {
        return mapperRegistry.hasMapper(type);
    }

}
